package org.com.behavioralPattern.interpreterPattern;

/**
 *
 * 解释器模式
 * @author Jonny
 * @version 1.0
 * @Description:
 * @date 2021/4/28 10:40
 */

/**
 *优点
 * ■ 简单的语法分析工具。
 * ■ 扩展性，修改语法规则只要修改相应的非终结符表达式即可，若扩展语法，则只要增加非终结符类即可
 *
 * 缺点
 *  ■ 解释器模式会引起类膨胀。每个语法都要产生一个非终结符表达式，语法比较复杂时就可能产生大量的类文件，不易维护。
 *  ■ 采用递归调用方法。每个非终结符表达式只关心与自己有关的表达式，每个表达式需要知道最终的结果，必须一层一层地剥茧，
 *  无论是面向过程的语言还是面向对象的语言，递归都是在必要条件下使用的，不易调试且影响效率。
 *
 * 应用场景
 * ■ 重复发生的问题可以使用解释器模式。例如，多个应用服务器，每天产生大量的日志，需要对日志文件进行分析处理，
 * 由于各个服务器的日志格式不同，但是数据要素是相同的，按照解释器的说法就是终结符表达式都是相同的，非终结符表达式就需要制定。
 * ■ 一个简单语法需要解释的场景。
 */
public class Test {
    public static void main(String[] args) {
        Variables v=new Variables();
        Variable x=new Variable();
        Variable y=new Variable();
        Variable z=new Variable();

        v.put(x,10);
        v.put(y,20);
        v.put(z,30);

        //计算x *(y+z/x)-x
        ArithmeticExpression e=new Substract(new Multiply(x,new Plus(y,new Division(z,x))),x);
        System.out.println(e.interpret(v));
    }

}
